/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.knolle.vistas;

import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import javax.swing.JComponent;
import org.marcelo.agro.core.api.InterfaceAbstractaAccesoADatos;
import org.marcelo.agro.entidades.Campanas;
import org.marcelo.agro.entidades.Lotes;
import org.marcelo.agro.entidades.LotesPorCampana;
import org.openide.DialogDisplayer;
import org.openide.WizardDescriptor;
import org.openide.awt.ActionID;
import org.openide.awt.ActionReference;
import org.openide.awt.ActionRegistration;
import org.openide.util.Lookup;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;

// An example action demonstrating how the wizard could be called from within
// your code. You can move the code below wherever you need, or register an action:
 @ActionID(category="File", id="org.knolle.vistas.CampaniasWizardAction")
 @ActionRegistration(displayName="Nueva Campaña")
 @ActionReference(path="Menu/File", position=310)
public final class CampaniasWizardAction implements ActionListener , Lookup.Provider{
     
     private final InstanceContent ic = new InstanceContent();
     private final Lookup lookup = new AbstractLookup(ic);

    @Override
    public void actionPerformed(ActionEvent e) {
        List<WizardDescriptor.Panel<WizardDescriptor>> panels = new ArrayList<WizardDescriptor.Panel<WizardDescriptor>>();
        panels.add(new CampaniasWizardPanel1());
        panels.add(new CampaniasWizardPanel2());
        String[] steps = new String[panels.size()];
        for (int i = 0; i < panels.size(); i++) {
            Component c = panels.get(i).getComponent();
            // Default step name to component name of panel.
            steps[i] = c.getName();
            if (c instanceof JComponent) { // assume Swing components
                JComponent jc = (JComponent) c;
                jc.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i);
                jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps);
                jc.putClientProperty(WizardDescriptor.PROP_AUTO_WIZARD_STYLE, true);
                jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DISPLAYED, true);
                jc.putClientProperty(WizardDescriptor.PROP_CONTENT_NUMBERED, true);
            }
        }
        WizardDescriptor wiz = new WizardDescriptor(new WizardDescriptor.ArrayIterator<WizardDescriptor>(panels));
        // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
        wiz.setTitleFormat(new MessageFormat("{0}"));
        wiz.setTitle("...Crear Campañas...");
        if (DialogDisplayer.getDefault().notify(wiz) == WizardDescriptor.FINISH_OPTION) {
            // Aca debo invocar a los metodos de guardado de datos
//            CampaniasWizardPanel2 wizard = (CampaniasWizardPanel2) panels.get(1);
            //Debo obtener los datos del panel 1 y del panel 2
            //Crear un nuevo Objeto Campaña, y tambien un nuevo objeto lotes?campañas
            //Setear los datos a campaña, setear los datos a lotes?campaña
            //Guardar los datos dentro de un commit, mostrar el resultado
            //Si fue exito OK, sino no ok
            //Esto debo hacerlo dentro de una transaccion para que si por algun motivo pasa algun problema
            //Pueda borrarse todo, no quede nada a medias
            //Tengo que buscar informacion sobre como lograr eso
            //Por ahora queda asi nomas
            //Si mal no entiendo en wiz que es el wizarDescriptor estan almacenados los datos que se guardaron,
            //desde alli debo invocar los datos para traerlos hasta aqui
            //traer los datos del wiz
            String campanhaNombre = (String)wiz.getProperty(CampaniasVisualPanel1.PROPIEDAD_NOMBRE);
            Date campanhaFechaInicio = (Date)wiz.getProperty(CampaniasVisualPanel1.PROPIEDAD_FECHA_INICIO);
            Date campanhaFechaFin = (Date)wiz.getProperty(CampaniasVisualPanel1.PROPIEDAD_FECHA_FIN);
//            Integer campanhaEstaActivo = (Integer) wiz.getProperty("campanhaEstaActivo");
            String campanhaDescripcion = (String)wiz.getProperty(CampaniasVisualPanel1.PROPIEDAD_DESCRIPCION);
            //Se cambio los datos chequear que el estado no sea null
            Integer estado = wiz.getProperty(CampaniasVisualPanel1.PROPIEDAD_ESTA_ACTIVO).equals("") ? 0:1;
            
            Lotes[] lotesElegidos = (Lotes[])wiz.getProperty("lotesSeleccionados");
            
            
            
            
            //Creando el objeto campanas con los datos
            Campanas campania = new Campanas(campanhaNombre, campanhaDescripcion,estado , campanhaFechaInicio, campanhaFechaFin, null, null);
            //Guardando los datos
            //Debo Iniciar una transaccion, guardar los datos y finalmente cerrar la transaccion;
            //Aqui es importante crear el array de datos para guardar enviarlo al metodo de guardado
            Object[] datosAGuardar;
            //Con este metodo realizo todo el guardado en una sola transaccion 
            //Obteniendo la lista de lotes Elegidos desde el dataModel Del List2
            if (lotesElegidos != null){
                datosAGuardar = new Object[lotesElegidos.length+1];
                datosAGuardar[0]= campania;
                for (int i=0; i < lotesElegidos.length ; i++) {             
                    LotesPorCampana lotesPorCampanas = new LotesPorCampana();
                    lotesPorCampanas.setCampanas(campania);
                    lotesPorCampanas.setLotes(lotesElegidos[i]);
                    datosAGuardar[i+1] = lotesPorCampanas;
//                    ControllerCampañas.save(lotesPorCampanas);
                }
            }
            else{
                datosAGuardar = new Object[1];
                datosAGuardar[0]= campania;
            }
//            Aca viene la parte donde se realiza el guardado de todos los objetos en una sola transaccion
            
            InterfaceAbstractaAccesoADatos iaad = Lookup.getDefault().lookup(InterfaceAbstractaAccesoADatos.class);
            try{
                iaad.saveOrUpdates(datosAGuardar);
                ic.set(Collections.singleton(campania), null);
                ic.add(campania);
            }
            catch(Exception ex){
                //mostrar el mensaje de error
                System.err.print(ex);
                ex.printStackTrace();
            
            }
            //Salio del bucle signitodos los resultados fueron buenos?
            
        }
    }

    @Override
    public Lookup getLookup() {
        return lookup;
    }
}
